#!/usr/bin/env python
# -*- coding: utf8 -*-

##############################################################################
#
#
#Machitext - muy sencillo editor de textos
#Copyleft (c) 2009 Machi Conca // juanmarceloconca at gmail dot com
# 
#Este programa es software libre; usted puede redistruirlo y/o modificarlo bajo
#los términos de la Licencia Pública General GNU, tal y como está publicada
#por la Free Software Foundation; ya sea la versión 2 de la Licencia, o (a su
#elección) cualquier versión posterior.
#
#Este programa se distribuye con la intención de ser útil, pero SIN NINGUNA
#GARANTÍA; incluso sin la garantía implícita de USABILIDAD O UTILIDAD PARA UN
#FIN PARTICULAR. Vea la Licencia Pública General GNU para más detalles.
#
#Usted debería haber recibido una copia de la Licencia Pública General GNU
#junto a este programa; si no es así, escriba a la Free Software Foundation,
#Inc. 675 Mass Ave, Cambridge, MA 02139, EEUU.
#
#
##############################################################################

import wx
import os


class Splash():
    
    def __init__(self):
        image = wx.Image('./imagenes/splash.bmp', wx.BITMAP_TYPE_BMP)
        bmp = image.ConvertToBitmap()
        wx.SplashScreen(bmp, wx.SPLASH_CENTRE_ON_SCREEN |
        wx.SPLASH_TIMEOUT, 3000, None, -1)
        wx.Yield()


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        kwds['style'] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.texto = wx.TextCtrl(self, -1, '', style=wx.TE_MULTILINE)
        self.a = self.texto.GetValue()
        

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle('MachiText')
        self.CenterOnScreen()
        
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        grid_sizer_1 = wx.FlexGridSizer(1, 1, 0, 0)
        grid_sizer_1.Add(self.texto, 0, wx.EXPAND, 0)
        self.SetSizer(grid_sizer_1)
        grid_sizer_1.AddGrowableRow(0)
        grid_sizer_1.AddGrowableCol(0)
        self.Layout()

# Esta parte de aca abajo es la ToolBar()
        # Esta parte fue hecha por pablo carrai, compañero del curso de programación
        # del centro de formación profesional San Cayetano de Carapachay (gracias Pablo).
        # El tsize fija el tamaño de las imagenes de abajo me evita tener que poner por cada imagen el tamaño
        tsize = (25,25)
        # estas variables son imagenes que luego aparecen en la barra ToolBar() esta es de nuevo
        new_bmp =  wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR, tsize)
        # La de abajo es de abrir
        open_bmp = wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR, tsize)
        # Copiar
        copy_bmp = wx.ArtProvider.GetBitmap(wx.ART_COPY, wx.ART_TOOLBAR, tsize)
        # Pegar
        paste_bmp = wx.ArtProvider.GetBitmap(wx.ART_PASTE, wx.ART_TOOLBAR, tsize)
        # Guardar
        guardar_bmp = wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_TOOLBAR, tsize)
        # Guardar como...
        guardarc_bmp = wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE_AS, wx.ART_TOOLBAR, tsize)
        # Imprimir
        #imprimir_bmp = wx.ArtProvider.GetBitmap(wx.ART_PRINT, wx.ART_TOOLBAR, tsize)
        # Cortar
        cortar_bmp = wx.ArtProvider.GetBitmap(wx.ART_CUT, wx.ART_TOOLBAR, tsize)
        # Salir
        salir_bmp = wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_TOOLBAR, tsize)

        # Aca hacemos algo parecido a lo que sucede con el menu, hay que adosarlo al Frame principal
        toolbar = self.CreateToolBar()
        # Una ves adosado al Frame comenzamos a agregar los elementos del ToolBar()
        # Nuevo
        toolbar.AddLabelTool(wx.ID_NEW, 'Nuevo',new_bmp, shortHelp = 'Nuevo', longHelp = 'Crea un nuevo documento')
        # Atamos el boton nuevo del ToolBar() a un evento de ToolBar() wx.EVT_TOOL, lo unimos a la funcion nuevo y usamos un id=wx.ID_NEW que es el identificador del widget, esto reenplaza al usado -1 es mejor por que cada widget tiene que tener un solo identificador. 
        self.Bind(wx.EVT_TOOL, self.OnNuevo, id = wx.ID_NEW)
        # Abrir
        toolbar.AddLabelTool(wx.ID_OPEN, 'Abrir',open_bmp, shortHelp = 'Abrir', longHelp = 'Abre un archivo')
        # Hacemos lo mismo con los otros botones del ToolBar() pueden ver que los id tambien fueron usados en los menues comunes. Asi que sirven para mucho. 
        self.Bind(wx.EVT_TOOL, self.OnAbrir, id = wx.ID_OPEN)
        # Guardar
        toolbar.AddSeparator()
        toolbar.AddLabelTool(wx.ID_SAVE, 'Guardar', guardar_bmp, shortHelp = 'Guardar', longHelp = 'Guarda un documento')
        # Guardar como
        self.Bind(wx.EVT_TOOL, self.OnGuardar, id = wx.ID_SAVE)
        toolbar.AddLabelTool(wx.ID_SAVEAS, 'Guardar como..', guardarc_bmp, shortHelp = 'Guardar Como..', longHelp = 'Guarda como..')
        self.Bind(wx.EVT_TOOL, self.OnGuardar_como, id = wx.ID_SAVEAS)
        toolbar.AddSeparator()
        # Imprimir
        #toolbar.AddLabelTool(wx.ID_PRINT, 'Imprimir', imprimir_bmp, shortHelp = 'Imprimir', longHelp = 'Imprimir')
        #self.Bind(wx.EVT_TOOL, self.Onimprimir, id = wx.ID_PRINT)
        # Cortar
        #toolbar.AddSeparator()
        toolbar.AddLabelTool(wx.ID_CUT, 'Cortar', cortar_bmp, shortHelp = 'Cortar', longHelp = 'Corta un elemento')
        self.Bind(wx.EVT_TOOL, self.OnCortar, id = wx.ID_CUT)
        # Cuarto Copiar
        toolbar.AddLabelTool(wx.ID_COPY, 'Copiar', copy_bmp, shortHelp = 'Copiar', longHelp = 'Copia un elemento')
        self.Bind(wx.EVT_TOOL, self.OnCopiar, id = wx.ID_COPY)
        # Pegar
        toolbar.AddLabelTool(wx.ID_PASTE, 'Pegar', paste_bmp, shortHelp = 'Pegar', longHelp = 'Pega un elemento')
        self.Bind(wx.EVT_TOOL, self.OnPegar, id = wx.ID_PASTE)
        toolbar.AddSeparator()
        # Salir 
        toolbar.AddLabelTool(wx.ID_EXIT, 'Salir', salir_bmp, shortHelp = 'Salir', longHelp = 'Sale de la aplicacion')
        self.Bind(wx.EVT_TOOL, self.OnSalir, id = wx.ID_EXIT)
        toolbar.Realize()
        # Aca agregamos las imagenes a los botones de la ToolBar()
        toolbar.SetToolBitmapSize(tsize)

        
        menu = wx.MenuBar()
        
        menuArchivo = wx.Menu()
        menu.Append(menuArchivo, u'&Archivo')
        self.nuevo = menuArchivo.Append(wx.ID_NEW, u'Nuevo\tCtrl+N', u'Nuevo')
        self.abrir = menuArchivo.Append(wx.ID_OPEN, u'Abrir\tCtrl+O', u'Abrir un documento nuevo')
        menuArchivo.AppendSeparator()
        self.guardar = menuArchivo.Append(wx.ID_SAVE, u'&Guardar\tCtrl+S', u'Guardar un documento nuevo')
        self.guardar_como = menuArchivo.Append(wx.ID_SAVEAS, u'&Guardar como...\tCtrl+H', u'Guardar un documento como.....')
        #menuArchivo.AppendSeparator()
        #self.imprimir = menuArchivo.Append(wx.ID_PRINT, u'&Imprimir\tCtrl+P', u'Imprimir un documento')
        menuArchivo.AppendSeparator()
        self.salir = menuArchivo.Append(wx.ID_EXIT,u'Salir\tCtrl+Q', u'Salir')

        menuEdicion = wx.Menu()
        menu.Append(menuEdicion, u'&Edición')
        self.copiar = menuEdicion.Append(wx.ID_COPY, u'Copiar\tCtrl+C', u'Copiar')
        self.cortar = menuEdicion.Append(wx.ID_CUT, u'Cortar\tCtrl+X', u'Cortar')
        self.pegar = menuEdicion.Append(wx.ID_PASTE, u'Pegar\tCtrl+V', u'Pegar')
        menuEdicion.AppendSeparator()
        self.seleccionar_todo = menuEdicion.Append(wx.ID_SELECTALL, u'Seleccionar todo\tCtrl+A', u'Seleccionar todo')

        menuHerramientas = wx.Menu()
        menu.Append(menuHerramientas, u'&Herramientas')

        menuAyuda = wx.Menu()
        menu.Append(menuAyuda, u'A&yuda')
        self.atajos_teclado = menuAyuda.Append(-1, u'Atajos de teclado', u'Atajos de teclado')
        menuAyuda.AppendSeparator()
        self.acerca_de = menuAyuda.Append(wx.ID_ABOUT, u'Acerca de', u'Acerca de.....') 
     
        self.SetMenuBar(menu)
        self.CreateStatusBar()
        self.SetStatusText(u'MachiText')
        
       
##### ESTOS SON LOS BOTONES PARA CADA FUNCIÓN #####

        self.Bind(wx.EVT_MENU, self.OnNuevo, self.nuevo)
        self.Bind(wx.EVT_MENU, self.OnAbrir, self.abrir)
        self.Bind(wx.EVT_MENU, self.OnGuardar, self.guardar)
        self.Bind(wx.EVT_MENU, self.OnGuardar_como, self.guardar_como)
        self.Bind(wx.EVT_MENU, self.OnSalir, self.salir)
        self.Bind(wx.EVT_MENU, self.OnCopiar, self.copiar)
        self.Bind(wx.EVT_MENU, self.OnCortar, self.cortar)
        self.Bind(wx.EVT_MENU, self.OnPegar, self.pegar)
        self.Bind(wx.EVT_MENU, self.OnSeleccionar_todo, self.seleccionar_todo)
        self.Bind(wx.EVT_MENU, self.OnAcerca_de, self.acerca_de)
        self.Bind(wx.EVT_MENU, self.OnAtajos_de_teclado, self.atajos_teclado)
        self.Bind(wx.EVT_CLOSE, self.OnCerrar_frame)
        

        self.Show()
        return True
        
    def OnCerrar_frame(self, evt):
        self.b = self.texto.GetValue()
        if self.a == self.b:
            self.Destroy()
        elif self.a != self.b:
            self.OnSalir(self)
        
    def OnNuevo(self, evt):
        dlg = wx.MessageDialog(self, '¿¿¿ Desea guardar el documento ???', 'MACHI TEXT EDITOR', wx.NO |wx.YES | wx.ICON_QUESTION)
        
        elegir_boton = dlg.ShowModal()
        if elegir_boton == wx.ID_NO:
            self.texto.Clear()
            #self.OnNuevo_2(self)
        elif elegir_boton == wx.ID_YES:
            self.OnVentana_nueva_destroy(self)
        
    def OnVentana_nueva_destroy(self, evt):
        self.OnGuardar(self)
        #self.Destroy()
        #self.Show()    
        
    def OnNuevo_2(self, evt):
        self.Destroy()
        self.Show()
        
    def OnAbrir(self, evt):
        self.dirname = u''
        self.filename = u''
        dlg = wx.FileDialog(self, u'Abrir archivo', self.dirname, '', '*.*', wx.OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            f = open(self.dirname+'/'+self.filename,'r')
            self.texto.SetValue(f.read())
            f.close()
            dlg.Destroy()
        
    def OnGuardar(self, evt):
        self.texto.WriteText(u'')
        dlg = wx.FileDialog(self, message = u'Guardar', defaultDir = os.getcwd(), defaultFile = u'', style = wx.SAVE)
        dlg.SetFilterIndex(2)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            guardar = self.texto.GetValue()
            f = open(path,'a')
            f.write(guardar)
            f.close()
        dlg.Destroy()
        
    def OnGuardar_como(self, evt):
        wildcard = u'Python source (*.py)|*.py|' \
           u'Compiled Python (*.pyc)|*.pyc|' \
           u'SPAM files (*.spam)|*.spam|' \
           u'Egg file (*.egg)|*.egg|' \
           u'Text (*.txt)|*.txt|' \
           u'All files (*.*)|*.*' \
        
        self.texto.WriteText(u'')
        dlg = wx.FileDialog(self, message = u'Guardar como', defaultDir = os.getcwd(), defaultFile = u'', wildcard = wildcard, style = wx.SAVE)
        dlg.SetFilterIndex(2)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            guardar_como = self.texto.GetValue()
            f = open(path,'a')
            f.write(guardar_como)
            f.close()
        dlg.Destroy()
        
    def OnSalir(self, evt):
        dlg = wx.MessageDialog(self, 'Desea guardar antes de salir?', 'MACHI TEXT EDITOR', wx.NO | wx.CANCEL |wx.YES | wx.ICON_QUESTION)
        
        elegir_boton = dlg.ShowModal()
        if elegir_boton == wx.ID_NO:
            self.OnSalir_2(self)
        elif elegir_boton == wx.ID_CANCEL:
            pass
        elif elegir_boton == wx.ID_YES:
            self.OnSalir_3(self)

    def OnSalir_2(self, evt):
        self.Destroy()
        
    def OnSalir_3(self, evt):
        self.OnGuardar(self)
        self.Destroy()
    
    def OnCopiar(self, evt):
        self.texto.Copy()

    def OnCortar(self, evt):
        self.texto.Cut()

    def OnPegar(self, evt):
        self.texto.Paste()

    def OnSeleccionar_todo(self, evt):
        self.texto.SelectAll()

    def OnAcerca_de(self, evt):
        try:
            self.close()
        except:
            import about
            acerca_de = about.About(self)
        
    def OnAtajos_de_teclado(self, evt):
        try:
            self.close()
        except:
            import atajosdeteclado
            atajos = atajosdeteclado.Atajos_de_teclado(self)
        
    def OnDestroy_atajos(self, evt):
        self.ventana_atajos.Destroy()

    #def Onimprimir(self, evt):
    #    try:
    #        self.close()
    #    except:
    #        import imprimir
    #        imprimiendo = imprimir.imprimiendo(self)
        


if __name__ == '__main__':
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame(None, -1, '', size = (800, 600))
    app.SetTopWindow(frame_1)
    splash = Splash()
    frame_1.Show()
    app.MainLoop()
    
